#ifndef B2D_IFILESYSTEM_H
#define B2D_IFILESYSTEM_H

#include "Stream.h"
#include <vector>

NS_B2D_BEGIN


////////////////////////////////////////////////////////////////////////////////////////////////////
/// \brief	Interface for platform specific filesystem
////////////////////////////////////////////////////////////////////////////////////////////////////
class B2D_API IFileSystem
{
	B2D_INTERFACE(IFileSystem)

public:
	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// \brief	Create a stream from the given path. Path does not have to be a real path, can be a
	/// 		path within a zip file or asset manager in a mobile device.
	///
	/// \param	path	Pathname of the file.
	///
	/// \return	null if it fails, else the stream.
	////////////////////////////////////////////////////////////////////////////////////////////////////
	virtual StreamPtr getStream(const string& path) const = 0;
	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// \brief	Queries if a given file exists.
	///
	/// \param	path	Path to the file.
	///
	/// \return	true if it succeeds, false if it fails.
	////////////////////////////////////////////////////////////////////////////////////////////////////
	virtual bool fileExists(const string& path) const = 0;
	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// \brief	Gets list of files.
	///
	/// \param [out]	output	The output vector.
	/// \param	path		  	Path to search for.
	/// \param	recursive	  	(optional) True to search recursively.
	///
	/// \return	true if it succeeds, false if it fails.
	////////////////////////////////////////////////////////////////////////////////////////////////////
	virtual bool getListOfFiles(std::vector<string>& output, const string& path, bool recursive = false) const = 0;

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// \brief	Gets file extension.
	///
	/// \param	path	Path of the file.
	///
	/// \return	The file extension.
	////////////////////////////////////////////////////////////////////////////////////////////////////
	virtual string getFileExtension(const string& path) const = 0;
};


NS_B2D_END

#endif